<?php if(!defined('IN_WDPHP'))exit('No direct script access.');
/**
 * WDPHP  			Debug类
 * @package 		WDPHP
 * @author 			肖伟 
 * @version 		v1.0
 * @copyright 		Copyright (c) 2012. widuu.com
 */
	class Debug {
		static $includefile=array();
		static $info=array();
		static $sqls=array();
		static $startTime;                //保存脚本开始执行时的时间（以微秒的形式保存）
		static $stopTime;                //保存脚本结束执行时的时间（以微秒的形式保存）
		
		static $msg = array(
       			 E_WARNING=>'运行时警告',
       			 E_NOTICE=>'运行时提醒',
        		 E_STRICT=>'编码标准化警告',
        		 E_USER_ERROR=>'自定义错误',
        		 E_USER_WARNING=>'自定义警告',
        		 E_USER_NOTICE=>'自定义提醒',
        		 'Unkown '=>'未知错误'
		 );

		/**
		 * 在脚本开始处调用获取脚本开始时间的微秒值
		 */
		static function start(){                       
			self::$startTime = microtime(true);   //将获取的时间赋给成员属性$startTime
		}
		/**
		 *在脚本结束处调用获取脚本结束时间的微秒值
		 */
		static function stop(){
			self::$stopTime= microtime(true);   //将获取的时间赋给成员属性$stopTime
		}

		/**
		 *返回同一脚本中两次获取时间的差值
		 */
		static function spent(){
			return round((self::$stopTime - self::$startTime) , 4);  //计算后以4舍5入保留4位返回
		}

    		/*错误 handler*/
   		static function Catcher($errno, $errstr, $errfile, $errline){
	   		if(!isset(self::$msg[$errno])) 
				$errno='Unkown';

			if($errno==E_NOTICE || $errno==E_USER_NOTICE)
				$color="#000088";
			else
				$color="red";

	   		$mess='<font color='.$color.'>';
	   		$mess.='<b>'.self::$msg[$errno]."</b>[在文件 {$errfile} 中,第 $errline 行]:";
	   		$mess.=$errstr;
	   		$mess.='</font>'; 		
	  		self::addMsg($mess);
		}
		
		/**
		 * 添加调试消息
		 * @param	string	$msg	调试消息字符串
		 * @param	int	$type	消息的类型
		 */
		
		static function addmsg($msg,$type=0) {
			if(defined("DEBUG") && DEBUG==1){
				switch($type){
					case 0:
						self::$info[]=$msg;
						break;
					case 1:
						self::$includefile[]=$msg;
						break;
					case 2:
						self::$sqls[]=$msg;
						break;
				}
			}
		}
		
		/**
		 * 输出调试消息
		 */
		 
		static function message(){
			$time=self::spent();								 //运行时间
			$retime=date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']);//请求时间
			$actionfile=$_SERVER['SCRIPT_FILENAME'];			 //当前脚本文件
			$browser=$_SERVER["HTTP_USER_AGENT"];				 //浏览器信息
			$sessId=session_id();							     //会话ID
			$protocol=$_SERVER["SERVER_PROTOCOL"];				 //请求协议
			
			//自动包含系统文件
			$includefile='';
			if(count(self::$includefile) > 0){
				foreach(self::$includefile as $key => $file){
					$includefile.='<p>['.$key.']=>'.$file."</p>\n\t\t\t";
				}		
			}else{
					$includefile="无";
			}
			
			//系统运行信息
			$info='';
			if(count(self::$info) > 0){
				foreach(self::$info as $key => $file){
					$info.='<p>['.$key.']=>'.$file."</p>\n\t\t\t";
				}		
			}else{
					$info="无";
			}
			
			
			//sql运行信息
			$sqls='';
			if(count(self::$sqls) > 0){
				foreach(self::$sqls as $key => $file){
					$sqls.='<p>['.$key.']=>'.$file."</p>\n\t\t\t";
				}		
			}else{
					$sqls="无";
			}
				
				$str=<<<EOF
		<div class="traceInfo" id="WDPHPtraceInfo">
		<div class="head"><span class="hd left">WDPHP TRACE:</span><span class="close" onmouseover="this.style.background='#cccccc';this.style.color='#000'" onmouseout="this.style.background='transparent';this.style.color=''"  onclick="window.document.body.removeChild(document.getElementById('WDPHPtraceInfo'))">×</span><span class="right">WDPHP v1.0</span></div>
			<div class="content">
			<p><span>运行用时:</span>{$time} 秒</p>
			<p><span>请求时间:</span>{$retime}</p>
			<p><span>当前页面:</span>{$actionfile}</p>
			<p><span>客 户 端:</span>{$browser}</p>
			<p><span>会 话 ID:</span>{$sessId}</p>
			<p><span>[ 自动加载类 ]:</span></p>
			<div class="classList">
				{$includefile}
			</div>
			<p><span>[ 运行信息 ]:</span></p>
			<div class="infoList">
				{$info}
			</div>
			<p><span>[ SQL信息 ]:</span></p>
			<div class="infoList">
				{$sqls}
			</div>
		</div>
		<style>
	*{ margin:0; padding:0;}
	 body{ font-size:12px;font-family:Verdana,"Microsoft YaHei", Geneva, sans-serif; }
	.orange{ color:#FF9900;}
	.red{ color:#FF0000;}.left{float:left;}.right{float:right;}
	.traceInfo{ width:800px; position:absolute; left:50%;text-align:left;margin-top:100px;margin-left:-400px; box-shadow:0px 0px 15px #cbcbcb; -moz-box-shadow:0px 0px 15px #cbcbcb; -ms-box-shadow:0px 0px 15px #cbcbcb; -o-box-shadow:0px 0px 15px #cbcbcb; -webkit-box-shadow:0px 0px 15px #cbcbcb; word-break:break-all; background: #fefefe; }
	.traceInfo .head{ line-height:25px;  background: #e5e5e5; padding: 0 10px; border-bottom: 1px solid #c0c0c0; height: 25px; }
	.traceInfo .head .hd{color: #F60; font-size:18px;}
	.traceInfo .head span{ color:#777; font-size:12px; font-weight:normal;}
	.traceInfo .head span.close{ border:1px solid #c0c0c0; cursor:pointer; height:12px; padding:2px 1px; width:16px;  text-align:center; line-height:10px; overflow:hidden; margin-top:4px; margin-left:20px; float:right;}
	.traceInfo .content { padding: 10px; color: #666; }
	.traceInfo .content .classList,.traceInfo .content .infoList { border: 1px dashed #ccc; padding: 5px; margin: 5px; font-family: Verdana,sans-serif,"Lucida Grande",Microsoft YaHei; }
	.traceInfo .content p { line-height: 1.5em; }
	.traceInfo .content p span { font-weight: bold; text-align: left; display: inline-block; word-spacing:2px; margin-right: 5px; }
	.traceInfo .content p span.class{ font-weight:normal;}
	.traceInfo ul ,.traceInfo ol{ margin-left:2em; color:#ccc;}
	.traceInfo ul strong.red{ color:#444;}
	</style>
	</div>
EOF;
	echo $str;
	
		}
	}
